/* 欧拉回路
* 1.概念:
    欧拉路径：从图中某个点出发遍历整个图，图中每条边通过且只通过一次。
    欧拉回路：起点和终点相同的欧拉路。
    奇点：度为奇数的点。
    偶点：度为偶数的点。

* 2.欧拉路径：
    起点和终点不是同一个点：
    (1)无向图：起点和终点一定是奇点，中间经过的点一定是偶点。
    (2)有向图：起点出度个数比入度大一，终点入度个数比出度大一。中间的出入度个数相等。

* 3.欧拉回路：
    起点和终点是同一个点。
    (1)无向图：所有点都是偶点。（所有点都可以是起点）。
    (2)有向图：所有点的出入度个数相等。

    注意：
    无向的连通图中不存在奇数的奇点。

* 4.对于无向图，所有边都是连通的。
    (1)存在欧拉路径的充分必要条件:度数为奇数的点只能有0或?个。
    (2)存在欧拉回路的充分必要条件:度数为奇数的点只能有0个。

* 5.对于有向图，所有边都是连通,
    (1)存在欧拉路径的充分必要条件:要么所有点的出度均等于入度;
                                要么除了两个点之外，其余所有点的出度等于入度，剩余的两个点:一个满足出度比入度多1(起点)，
                                                                                      另一个满足入度比出度多1(终点)
    (2)存在欧拉回路的充分必要条件:所有点的出度均等于入度。

* 6.存欧拉路径解释:因为如果某点存在多条边，且有环，则某条边可能会dfs直通终点。
    因为没有先遍历环，则不能先存入遍历的点(边)，要该点的所有邻边遍历完，准备回溯时存入点(边),最后再逆序输出就是欧拉回路(路径)走的顺序。
 
* 本题: 
    模板题 
*/

#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <iostream>
#include <cstring>
#include <algorithm>
// #define ONLINE_GUDGE
using namespace std;
const int N = 100010, M = 400010;

int t,n,m,type;
int h[N], hs[N], e[M], ne[M], idx;
int ans[M/2], cnt;
bool used[M];
int din[N], dout[N];

void AddEdge(int a, int b) // , int c)
{ e[idx] = b, ne[idx] = h[a], h[a] = idx ++;} // w[idx] = c, 

void dfs(int u)
{
    for(int i = h[u]; ~i;){
        if(used[i]){
            i = ne[i]; // 当前边已使用，则跳过
            continue; 
        }
        
        used[i] = true;
        if(type == 1) used[i ^ 1] = true; // 无向图的反边, 两个方向只能走一次
        
        int t; // 边的idx
        if(type == 1){
            t = i / 2 + 1; // 无向图每条边存了两个方向，因此边的编号 = 散列表边的编号 / 2 + 1
            if(i & 1) t = -t;
        }else t = i + 1; // 有向图中边的编号 = 散列表边的编号 + 1
        dfs(e[i]);
        ans[ ++ cnt ] = t;
    }
}

int main()
{

    #ifdef ONLINE_JUDGE

    #else
    freopen("./in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(false);   
	cin.tie(0);
    
    cin >> type >> n >> m;
    memset(h, -1, sizeof h);

    for(int i = 0; i < m; i++){
        int a, b; cin >> a >> b;
        AddEdge(a, b);
        if(type == 1) AddEdge(b, a); 
        din[b]++, dout[a]++;
    }

    // 判断无向图是否存在欧拉回路
    if(type == 1){ 
        for(int i = 1;i<=n;i++){
            if(din[i] + dout[i] & 1){
                puts("NO");
                return 0;
            }
        }
    }
    else{ // 判断有向图是否存在欧拉回路
        for(int i = 1;i<=n;i++){
            if(din[i] != dout[i]){
                puts("NO");
                return 0;
            }
        }
    }
    
    // 非孤立点作为起点
    for(int i = 1;i<=n;i++){
        if(h[i] != -1){
            dfs(i);
            break;
        }
    }

    if(cnt < m){
       puts("NO"); return 0;
    } 

    puts("YES");
    for(int i = cnt;i;i--) printf("%d ",ans[i]);
    

    return 0;
}